library(data.table)
library(lfe)
library(jtools)
library(stargazer)
library(minpack.lm)
source("nlstargazer.r")

Read file generated in Python

df <- fread("data_output/regression_Chile_2021.csv")
df <- subset(df, candidate == "JOSE ANTONIO KAST RIST") # 
df

Run OLS Regression Models

model_1 <- lm(rate ~ rate_parisi + rate_kast + rate_meo + rate_sichel + rate_provoste, data = df)
model_2 <- lm(rate ~ divisiveness_parisi + divisiveness_kast + divisiveness_meo + divisiveness_sichel + divisiveness_provoste, data = df)
model_3 <- lm(rate ~ rate_parisi + rate_kast + rate_meo + rate_sichel + rate_provoste + divisiveness_parisi + divisiveness_kast + divisiveness_meo + divisiveness_sichel + divisiveness_provoste, data = df)

stargazer(model_1, model_2, model_3, type = "text")

===============================================================================================================
                                                         Dependent variable:                                   
                      -----------------------------------------------------------------------------------------
                                                                rate                                           
                                   (1)                          (2)                           (3)              
---------------------------------------------------------------------------------------------------------------
rate_parisi                     0.481***                                                    0.477***           
                                 (0.003)                                                    (0.004)            
                                                                                                               
rate_kast                       1.244***                                                    1.218***           
                                 (0.002)                                                    (0.003)            
                                                                                                               
rate_meo                        0.164***                                                    0.165***           
                                 (0.006)                                                    (0.006)            
                                                                                                               
rate_sichel                     0.871***                                                    0.893***           
                                 (0.004)                                                    (0.005)            
                                                                                                               
rate_provoste                   0.389***                                                    0.407***           
                                 (0.004)                                                    (0.004)            
                                                                                                               
divisiveness_parisi                                          -0.414***                      0.137***           
                                                              (0.040)                       (0.016)            
                                                                                                               
divisiveness_kast                                             3.751***                      0.416***           
                                                              (0.059)                       (0.023)            
                                                                                                               
divisiveness_meo                                             -11.985***                    -0.968***           
                                                              (0.146)                       (0.056)            
                                                                                                               
divisiveness_sichel                                           2.131***                      0.181***           
                                                              (0.103)                       (0.036)            
                                                                                                               
divisiveness_provoste                                        -0.317***                     -0.323***           
                                                              (0.072)                       (0.027)            
                                                                                                               
Constant                        -0.142***                     0.514***                     -0.138***           
                                 (0.002)                      (0.006)                       (0.003)            
                                                                                                               
---------------------------------------------------------------------------------------------------------------
Observations                     46,638                        46,639                        46,638            
R2                                0.907                        0.229                         0.908             
Adjusted R2                       0.907                        0.229                         0.908             
Residual Std. Error        0.041 (df = 46632)            0.117 (df = 46633)            0.040 (df = 46627)      
F Statistic           90,572.760*** (df = 5; 46632) 2,775.638*** (df = 5; 46633) 46,106.500*** (df = 10; 46627)
===============================================================================================================
Note:                                                                               *p<0.1; **p<0.05; ***p<0.01
model_1 <- nlsLM(
    formula = rate ~ const + b_parisi*rate_parisi + b_kast*rate_kast + b_meo*rate_meo + b_sichel*rate_sichel + b_provoste*rate_provoste,
    data = df, 
    start = list(const=0, b_parisi=0, b_kast=0, b_meo=0, b_sichel=0, b_provoste=0),
    lower = c(const=-Inf, b_parisi=0, b_kast=0, b_meo=0, b_sichel=0, b_provoste=0),
    upper = c(const=Inf, b_parisi=1, b_kast=1, b_meo=1, b_sichel=1, b_provoste=1),
    algorithm = "port",
    model = FALSE
)

model_2 <- nlsLM(
    formula = rate ~ const + d_parisi*divisiveness_parisi + d_kast*divisiveness_kast + d_meo*divisiveness_meo + d_sichel*divisiveness_sichel + d_provoste*divisiveness_provoste,
    data = df, 
    start = list(const=0, d_parisi=0, d_kast=0, d_meo=0, d_sichel=0, d_provoste=0)
)

model_3 <- nlsLM(
    formula = rate ~ const + b_parisi*rate_parisi + b_kast*rate_kast + b_meo*rate_meo + b_sichel*rate_sichel + b_provoste*rate_provoste + d_parisi*divisiveness_parisi + d_kast*divisiveness_kast + d_meo*divisiveness_meo + d_sichel*divisiveness_sichel + d_provoste*divisiveness_provoste,
    data = df, 
    start = list(const=0, b_parisi=0, b_kast=0, b_meo=0, b_sichel=0, b_provoste=0, d_parisi=0, d_kast=0, d_meo=0, d_sichel=0, d_provoste=0),
    lower = c(const=-Inf, b_parisi=0, b_kast=0, b_meo=0, b_sichel=0, b_provoste=0, d_parisi=-Inf, d_kast=-Inf, d_meo=-Inf, d_sichel=-Inf, d_provoste=-Inf),
    upper = c(const=Inf, b_parisi=1, b_kast=1, b_meo=1, b_sichel=1, b_provoste=1, d_parisi=Inf, d_kast=Inf, d_meo=Inf, d_sichel=Inf, d_provoste=Inf)
)

models <- list(model_1, model_2, model_3)
nlstargazer(models = models)
Summary
Parameters Model.1 Model.2 Model.3
b_kast 1.0000*** 1.0000***
b_meo 0.0000 0.0000
b_parisi 0.3670*** 0.3585***
b_provoste 0.3107*** 0.3258***
b_sichel 0.8092*** 0.9105***
const -0.0263*** 0.5140*** -0.0303***
d_kast 3.7511*** 0.9900***
d_meo -11.9850*** -2.4661***
d_parisi -0.4138*** 0.2355***
d_provoste -0.3169*** -0.3763***
d_sichel 2.1307*** 0.0855**
Residual sum-of-squares 96.46 633.17 84.9
NA
data1r <- fread("data_output/Chile/2021_first_round.csv.gz")
data_1r <- data1r[ , .(value = sum(value)), by = candidate]
data_1r$rate <- data_1r$value / sum(data_1r$value)
data_1r
candidates <- c(subset(data_1r, rate > 0.02)[["candidate"]])
candidates
[1] "GABRIEL BORIC FONT"             "JOSE ANTONIO KAST RIST"         "YASNA PROVOSTE CAMPILLAY"       "SEBASTIAN SICHEL RAMIREZ"      
[5] "MARCO ENRIQUEZ-OMINAMI GUMUCIO" "FRANCO PARISI FERNANDEZ"       
coefs <- coef(model_1)
df_model <- data.table(
  candidate = c("JOSE ANTONIO KAST RIST", "YASNA PROVOSTE CAMPILLAY", "SEBASTIAN SICHEL RAMIREZ", "MARCO ENRIQUEZ-OMINAMI GUMUCIO", "FRANCO PARISI FERNANDEZ"),
  coef = c(coefs[["b_kast"]], coefs[["b_provoste"]], coefs[["b_sichel"]], coefs[["b_meo"]], coefs[["b_parisi"]])
)
df_model <- merge(df_model, data_1r, all=TRUE)
df_model[["1_coef"]] <- 1 - df_model$coef


df_model[["to_candidate_a"]] <- df_model[["rate"]] * df_model[["coef"]]
df_model[["to_candidate_b"]] <- df_model[["rate"]] * df_model[["1_coef"]]

df_model
draw_sankey(df_model, candidates)
[1] "FRANCO PARISI FERNANDEZ"
[1] "JOSE ANTONIO KAST RIST"
[1] "MARCO ENRIQUEZ-OMINAMI GUMUCIO"
[1] "SEBASTIAN SICHEL RAMIREZ"
[1] "YASNA PROVOSTE CAMPILLAY"
[1] "#0D0066"
source <- c()
target <- c()
value <- c()

idx_candidate_a <- length(candidates) + 0
idx_candidate_b <- length(candidates) + 1

for(i in 1:nrow(df_model)) {
  row <- df_model[i, ]
  candidate <- row[["candidate"]]
  idx <- which(candidates == candidate)[1] - 1

  if (!(is.na(row[["coef"]]))) {
    print(candidate)
    source <- append(source, idx)
    target <- append(target, idx_candidate_a) # BORIC
    value <- append(value, row[["to_candidate_b"]] * 100)
    
    source <- append(source, idx)
    target <- append(target, idx_candidate_b) # KAST
    value <- append(value, row[["to_candidate_a"]] * 100)
  }

  else if (candidate == "GABRIEL BORIC FONT") {
    source <- append(source, idx)
    target <- append(target, idx_candidate_a) # BORIC
    value <- append(value, row[["rate"]] * 100)
    
    source <- append(source, idx)
    target <- append(target, idx_candidate_b) # KAST
    value <- append(value, 0)
  }
  
}
[1] "FRANCO PARISI FERNANDEZ"
[1] "JOSE ANTONIO KAST RIST"
[1] "MARCO ENRIQUEZ-OMINAMI GUMUCIO"
[1] "SEBASTIAN SICHEL RAMIREZ"
[1] "YASNA PROVOSTE CAMPILLAY"
# Load the package required to read JSON files.
library("rjson")
# Give the input file name to the function.
colors <- fromJSON(file="consts.json")
# Print the result.
print(colors[["FRANCO PARISI FERNANDEZ"]])
[1] "#0D0066"
label <- c(candidates, c("GABRIEL BORIC FONT", "JOSE ANTONIO KAST RIST"))
color_label <- c()

for (x in label) {
  color_label <- append(color_label, colors[[x]])
}

color_label
[1] "#E71455" "#22446d" "#870C7C" "#E7DD14" "#F429E3" "#0D0066" "#E71455" "#22446d"
library(plotly)

fig <- plot_ly(
    type = "sankey",
    orientation = "h",

    node = list(
      label = label,
      color = color_label,
      pad = 15,
      thickness = 20,
      line = list(
        color = "black",
        width = 0
      )
    ),

    link = list(
      source = source,
      target = target,
      value =  value,
      color = "#ebebeb"
    )
  )
fig <- fig %>% layout(
    title = "",
    font = list(
      size = 16
    )
)

fig
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkobGZlKQ0KbGlicmFyeShqdG9vbHMpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkobWlucGFjay5sbSkNCnNvdXJjZSgibmxzdGFyZ2F6ZXIuciIpDQpgYGANCg0KDQpSZWFkIGZpbGUgZ2VuZXJhdGVkIGluIFB5dGhvbg0KYGBge3J9DQpkZiA8LSBmcmVhZCgiZGF0YV9vdXRwdXQvcmVncmVzc2lvbl9DaGlsZV8yMDIxLmNzdiIpDQpkZiA8LSBzdWJzZXQoZGYsIGNhbmRpZGF0ZSA9PSAiSk9TRSBBTlRPTklPIEtBU1QgUklTVCIpICMgDQpkZg0KYGBgDQoNCg0KUnVuIE9MUyBSZWdyZXNzaW9uIE1vZGVscw0KYGBge3J9DQptb2RlbF8xIDwtIGxtKHJhdGUgfiByYXRlX3BhcmlzaSArIHJhdGVfa2FzdCArIHJhdGVfbWVvICsgcmF0ZV9zaWNoZWwgKyByYXRlX3Byb3Zvc3RlLCBkYXRhID0gZGYpDQptb2RlbF8yIDwtIGxtKHJhdGUgfiBkaXZpc2l2ZW5lc3NfcGFyaXNpICsgZGl2aXNpdmVuZXNzX2thc3QgKyBkaXZpc2l2ZW5lc3NfbWVvICsgZGl2aXNpdmVuZXNzX3NpY2hlbCArIGRpdmlzaXZlbmVzc19wcm92b3N0ZSwgZGF0YSA9IGRmKQ0KbW9kZWxfMyA8LSBsbShyYXRlIH4gcmF0ZV9wYXJpc2kgKyByYXRlX2thc3QgKyByYXRlX21lbyArIHJhdGVfc2ljaGVsICsgcmF0ZV9wcm92b3N0ZSArIGRpdmlzaXZlbmVzc19wYXJpc2kgKyBkaXZpc2l2ZW5lc3Nfa2FzdCArIGRpdmlzaXZlbmVzc19tZW8gKyBkaXZpc2l2ZW5lc3Nfc2ljaGVsICsgZGl2aXNpdmVuZXNzX3Byb3Zvc3RlLCBkYXRhID0gZGYpDQoNCnN0YXJnYXplcihtb2RlbF8xLCBtb2RlbF8yLCBtb2RlbF8zLCB0eXBlID0gInRleHQiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KbW9kZWxfMSA8LSBubHNMTSgNCiAgICBmb3JtdWxhID0gcmF0ZSB+IGNvbnN0ICsgYl9wYXJpc2kqcmF0ZV9wYXJpc2kgKyBiX2thc3QqcmF0ZV9rYXN0ICsgYl9tZW8qcmF0ZV9tZW8gKyBiX3NpY2hlbCpyYXRlX3NpY2hlbCArIGJfcHJvdm9zdGUqcmF0ZV9wcm92b3N0ZSwNCiAgICBkYXRhID0gZGYsIA0KICAgIHN0YXJ0ID0gbGlzdChjb25zdD0wLCBiX3BhcmlzaT0wLCBiX2thc3Q9MCwgYl9tZW89MCwgYl9zaWNoZWw9MCwgYl9wcm92b3N0ZT0wKSwNCiAgICBsb3dlciA9IGMoY29uc3Q9LUluZiwgYl9wYXJpc2k9MCwgYl9rYXN0PTAsIGJfbWVvPTAsIGJfc2ljaGVsPTAsIGJfcHJvdm9zdGU9MCksDQogICAgdXBwZXIgPSBjKGNvbnN0PUluZiwgYl9wYXJpc2k9MSwgYl9rYXN0PTEsIGJfbWVvPTEsIGJfc2ljaGVsPTEsIGJfcHJvdm9zdGU9MSksDQogICAgYWxnb3JpdGhtID0gInBvcnQiLA0KICAgIG1vZGVsID0gRkFMU0UNCikNCg0KbW9kZWxfMiA8LSBubHNMTSgNCiAgICBmb3JtdWxhID0gcmF0ZSB+IGNvbnN0ICsgZF9wYXJpc2kqZGl2aXNpdmVuZXNzX3BhcmlzaSArIGRfa2FzdCpkaXZpc2l2ZW5lc3Nfa2FzdCArIGRfbWVvKmRpdmlzaXZlbmVzc19tZW8gKyBkX3NpY2hlbCpkaXZpc2l2ZW5lc3Nfc2ljaGVsICsgZF9wcm92b3N0ZSpkaXZpc2l2ZW5lc3NfcHJvdm9zdGUsDQogICAgZGF0YSA9IGRmLCANCiAgICBzdGFydCA9IGxpc3QoY29uc3Q9MCwgZF9wYXJpc2k9MCwgZF9rYXN0PTAsIGRfbWVvPTAsIGRfc2ljaGVsPTAsIGRfcHJvdm9zdGU9MCkNCikNCg0KbW9kZWxfMyA8LSBubHNMTSgNCiAgICBmb3JtdWxhID0gcmF0ZSB+IGNvbnN0ICsgYl9wYXJpc2kqcmF0ZV9wYXJpc2kgKyBiX2thc3QqcmF0ZV9rYXN0ICsgYl9tZW8qcmF0ZV9tZW8gKyBiX3NpY2hlbCpyYXRlX3NpY2hlbCArIGJfcHJvdm9zdGUqcmF0ZV9wcm92b3N0ZSArIGRfcGFyaXNpKmRpdmlzaXZlbmVzc19wYXJpc2kgKyBkX2thc3QqZGl2aXNpdmVuZXNzX2thc3QgKyBkX21lbypkaXZpc2l2ZW5lc3NfbWVvICsgZF9zaWNoZWwqZGl2aXNpdmVuZXNzX3NpY2hlbCArIGRfcHJvdm9zdGUqZGl2aXNpdmVuZXNzX3Byb3Zvc3RlLA0KICAgIGRhdGEgPSBkZiwgDQogICAgc3RhcnQgPSBsaXN0KGNvbnN0PTAsIGJfcGFyaXNpPTAsIGJfa2FzdD0wLCBiX21lbz0wLCBiX3NpY2hlbD0wLCBiX3Byb3Zvc3RlPTAsIGRfcGFyaXNpPTAsIGRfa2FzdD0wLCBkX21lbz0wLCBkX3NpY2hlbD0wLCBkX3Byb3Zvc3RlPTApLA0KICAgIGxvd2VyID0gYyhjb25zdD0tSW5mLCBiX3BhcmlzaT0wLCBiX2thc3Q9MCwgYl9tZW89MCwgYl9zaWNoZWw9MCwgYl9wcm92b3N0ZT0wLCBkX3BhcmlzaT0tSW5mLCBkX2thc3Q9LUluZiwgZF9tZW89LUluZiwgZF9zaWNoZWw9LUluZiwgZF9wcm92b3N0ZT0tSW5mKSwNCiAgICB1cHBlciA9IGMoY29uc3Q9SW5mLCBiX3BhcmlzaT0xLCBiX2thc3Q9MSwgYl9tZW89MSwgYl9zaWNoZWw9MSwgYl9wcm92b3N0ZT0xLCBkX3BhcmlzaT1JbmYsIGRfa2FzdD1JbmYsIGRfbWVvPUluZiwgZF9zaWNoZWw9SW5mLCBkX3Byb3Zvc3RlPUluZikNCikNCg0KbW9kZWxzIDwtIGxpc3QobW9kZWxfMSwgbW9kZWxfMiwgbW9kZWxfMykNCm5sc3RhcmdhemVyKG1vZGVscyA9IG1vZGVscykNCg0KYGBgDQpgYGB7cn0NCg0KYGBgDQoNCmBgYHtyfQ0KZGF0YTFyIDwtIGZyZWFkKCJkYXRhX291dHB1dC9DaGlsZS8yMDIxX2ZpcnN0X3JvdW5kLmNzdi5neiIpDQpkYXRhXzFyIDwtIGRhdGExclsgLCAuKHZhbHVlID0gc3VtKHZhbHVlKSksIGJ5ID0gY2FuZGlkYXRlXQ0KZGF0YV8xciRyYXRlIDwtIGRhdGFfMXIkdmFsdWUgLyBzdW0oZGF0YV8xciR2YWx1ZSkNCmRhdGFfMXINCmBgYA0KDQoNCmBgYHtyfQ0KY2FuZGlkYXRlcyA8LSBjKHN1YnNldChkYXRhXzFyLCByYXRlID4gMC4wMilbWyJjYW5kaWRhdGUiXV0pDQpjYW5kaWRhdGVzDQpgYGANCg0KDQoNCmBgYHtyfQ0KY29lZnMgPC0gY29lZihtb2RlbF8xKQ0KZGZfbW9kZWwgPC0gZGF0YS50YWJsZSgNCiAgY2FuZGlkYXRlID0gYygiSk9TRSBBTlRPTklPIEtBU1QgUklTVCIsICJZQVNOQSBQUk9WT1NURSBDQU1QSUxMQVkiLCAiU0VCQVNUSUFOIFNJQ0hFTCBSQU1JUkVaIiwgIk1BUkNPIEVOUklRVUVaLU9NSU5BTUkgR1VNVUNJTyIsICJGUkFOQ08gUEFSSVNJIEZFUk5BTkRFWiIpLA0KICBjb2VmID0gYyhjb2Vmc1tbImJfa2FzdCJdXSwgY29lZnNbWyJiX3Byb3Zvc3RlIl1dLCBjb2Vmc1tbImJfc2ljaGVsIl1dLCBjb2Vmc1tbImJfbWVvIl1dLCBjb2Vmc1tbImJfcGFyaXNpIl1dKQ0KKQ0KZGZfbW9kZWwgPC0gbWVyZ2UoZGZfbW9kZWwsIGRhdGFfMXIsIGFsbD1UUlVFKQ0KZGZfbW9kZWxbWyIxX2NvZWYiXV0gPC0gMSAtIGRmX21vZGVsJGNvZWYNCg0KDQpkZl9tb2RlbFtbInRvX2NhbmRpZGF0ZV9hIl1dIDwtIGRmX21vZGVsW1sicmF0ZSJdXSAqIGRmX21vZGVsW1siY29lZiJdXQ0KZGZfbW9kZWxbWyJ0b19jYW5kaWRhdGVfYiJdXSA8LSBkZl9tb2RlbFtbInJhdGUiXV0gKiBkZl9tb2RlbFtbIjFfY29lZiJdXQ0KDQpkZl9tb2RlbA0KYGBgDQpgYGB7cn0NCmRyYXdfc2Fua2V5KGRmX21vZGVsLCBjYW5kaWRhdGVzKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnNvdXJjZSA8LSBjKCkNCnRhcmdldCA8LSBjKCkNCnZhbHVlIDwtIGMoKQ0KDQppZHhfY2FuZGlkYXRlX2EgPC0gbGVuZ3RoKGNhbmRpZGF0ZXMpICsgMA0KaWR4X2NhbmRpZGF0ZV9iIDwtIGxlbmd0aChjYW5kaWRhdGVzKSArIDENCg0KZm9yKGkgaW4gMTpucm93KGRmX21vZGVsKSkgew0KICByb3cgPC0gZGZfbW9kZWxbaSwgXQ0KICBjYW5kaWRhdGUgPC0gcm93W1siY2FuZGlkYXRlIl1dDQogIGlkeCA8LSB3aGljaChjYW5kaWRhdGVzID09IGNhbmRpZGF0ZSlbMV0gLSAxDQoNCiAgaWYgKCEoaXMubmEocm93W1siY29lZiJdXSkpKSB7DQogICAgcHJpbnQoY2FuZGlkYXRlKQ0KICAgIHNvdXJjZSA8LSBhcHBlbmQoc291cmNlLCBpZHgpDQogICAgdGFyZ2V0IDwtIGFwcGVuZCh0YXJnZXQsIGlkeF9jYW5kaWRhdGVfYSkgIyBCT1JJQw0KICAgIHZhbHVlIDwtIGFwcGVuZCh2YWx1ZSwgcm93W1sidG9fY2FuZGlkYXRlX2IiXV0gKiAxMDApDQogICAgDQogICAgc291cmNlIDwtIGFwcGVuZChzb3VyY2UsIGlkeCkNCiAgICB0YXJnZXQgPC0gYXBwZW5kKHRhcmdldCwgaWR4X2NhbmRpZGF0ZV9iKSAjIEtBU1QNCiAgICB2YWx1ZSA8LSBhcHBlbmQodmFsdWUsIHJvd1tbInRvX2NhbmRpZGF0ZV9hIl1dICogMTAwKQ0KICB9DQoNCiAgZWxzZSBpZiAoY2FuZGlkYXRlID09ICJHQUJSSUVMIEJPUklDIEZPTlQiKSB7DQogICAgc291cmNlIDwtIGFwcGVuZChzb3VyY2UsIGlkeCkNCiAgICB0YXJnZXQgPC0gYXBwZW5kKHRhcmdldCwgaWR4X2NhbmRpZGF0ZV9hKSAjIEJPUklDDQogICAgdmFsdWUgPC0gYXBwZW5kKHZhbHVlLCByb3dbWyJyYXRlIl1dICogMTAwKQ0KICAgIA0KICAgIHNvdXJjZSA8LSBhcHBlbmQoc291cmNlLCBpZHgpDQogICAgdGFyZ2V0IDwtIGFwcGVuZCh0YXJnZXQsIGlkeF9jYW5kaWRhdGVfYikgIyBLQVNUDQogICAgdmFsdWUgPC0gYXBwZW5kKHZhbHVlLCAwKQ0KICB9DQogIA0KfQ0KYGBgDQoNCmBgYHtyfQ0KIyBMb2FkIHRoZSBwYWNrYWdlIHJlcXVpcmVkIHRvIHJlYWQgSlNPTiBmaWxlcy4NCmxpYnJhcnkoInJqc29uIikNCiMgR2l2ZSB0aGUgaW5wdXQgZmlsZSBuYW1lIHRvIHRoZSBmdW5jdGlvbi4NCmNvbG9ycyA8LSBmcm9tSlNPTihmaWxlPSJjb25zdHMuanNvbiIpDQojIFByaW50IHRoZSByZXN1bHQuDQpwcmludChjb2xvcnNbWyJGUkFOQ08gUEFSSVNJIEZFUk5BTkRFWiJdXSkNCg0KbGFiZWwgPC0gYyhjYW5kaWRhdGVzLCBjKCJHQUJSSUVMIEJPUklDIEZPTlQiLCAiSk9TRSBBTlRPTklPIEtBU1QgUklTVCIpKQ0KY29sb3JfbGFiZWwgPC0gYygpDQoNCmZvciAoeCBpbiBsYWJlbCkgew0KICBjb2xvcl9sYWJlbCA8LSBhcHBlbmQoY29sb3JfbGFiZWwsIGNvbG9yc1tbeF1dKQ0KfQ0KDQpjb2xvcl9sYWJlbA0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCg0KZmlnIDwtIHBsb3RfbHkoDQogICAgdHlwZSA9ICJzYW5rZXkiLA0KICAgIG9yaWVudGF0aW9uID0gImgiLA0KDQogICAgbm9kZSA9IGxpc3QoDQogICAgICBsYWJlbCA9IGxhYmVsLA0KICAgICAgY29sb3IgPSBjb2xvcl9sYWJlbCwNCiAgICAgIHBhZCA9IDE1LA0KICAgICAgdGhpY2tuZXNzID0gMjAsDQogICAgICBsaW5lID0gbGlzdCgNCiAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICB3aWR0aCA9IDANCiAgICAgICkNCiAgICApLA0KDQogICAgbGluayA9IGxpc3QoDQogICAgICBzb3VyY2UgPSBzb3VyY2UsDQogICAgICB0YXJnZXQgPSB0YXJnZXQsDQogICAgICB2YWx1ZSA9ICB2YWx1ZSwNCiAgICAgIGNvbG9yID0gIiNlYmViZWIiDQogICAgKQ0KICApDQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoDQogICAgdGl0bGUgPSAiIiwNCiAgICBmb250ID0gbGlzdCgNCiAgICAgIHNpemUgPSAxNg0KICAgICkNCikNCg0KZmlnDQpgYGANCg0K